/**
 * @file fork1.c
 * @author liangwenhao (1943080020@qq.com)
 * @brief 
 * @version 0.1
 * @date 2021-07-23
 * 
 * @copyright Copyright (c) 2021
 * 
 * @authorGitee  https://gitee.com/liangwenhao
 * @authorGithub https://github.com/WHaoL
 * @authorBlogs https://blog.csdn.net/liangwenhao1108
 *  
 * @Code Description: P183-184 测试fork()函数，
 *                    可以看到子进程对变量所做的改变并不影响父进程中该变量的值
 *  
 */

#include "apue.h"

int globvar = 6; //外部变量，并初始化
char buf[] = "a write to stdout\n";

int main()
{
    int var; //自动变量，存储在stack
    pid_t pid;

    var = 88;

    //write()是不带缓冲区的
    if (write(STDOUT_FILENO, buf, sizeof(buf) - 1) != sizeof(buf) - 1)
        err_sys("write error");

    //printf()是标准I/O库函数，是带缓冲区的
    //当输出到终端时是行缓冲，当输出到文件是全缓冲。此处我们没有主动冲刷缓冲区
    printf("before fork\n");

    if ((pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0)
    {
        //child
        globvar++;
        var++;
    }
    else
    {
        //parent
        sleep(2);
    }

    printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, var);
    exit(0); //return 0;
}

/*

lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/08_Process_Ctl$ ./fork1  #行缓冲时
a write to stdout
before fork                                                          #行缓冲遇到换行符直接输出
pid = 25337, glob = 7, var = 89
pid = 25336, glob = 6, var = 88


lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/08_Process_Ctl$ ./fork1 > fork1.log #全缓冲时
lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/08_Process_Ctl$ cat fork1.log 
a write to stdout
before fork                                                 #全缓冲时，这个字符串在缓冲区，没有被输出到文件(因为没有达到4096)
pid = 25349, glob = 7, var = 89
before fork                                                 #fork之后，缓冲区中的内数据，也被复制到子进程中，
pid = 25348, glob = 6, var = 88
lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/08_Process_Ctl$ 
                                                            #当每个进程终止的时候，缓冲区中的内容都被写到相应文件中，
                                                            #由于fork()时子进程复制了父进程的文件描述表，所以这两个进程拿到的文件描述父是一样的
                                                            #所以都把各自缓冲区的内容刷到了同一个文件中
*/